/**
 * 邮箱验证
 * @param {*} str:字符串
 * 用户名部分可以包含字母、数字、点号（.）、下划线（_）或连字符（-），并且至少要有一个字符
 * 后面是一个 @ 符号
 * 域名部分可以包含字母、数字、下划线或连字符，并且至少要有一个字符
 * 可选项：域名后面跟着一个或两个由一个点号开头的顶级域名，每个顶级域名由2到3个字母组成
 */
export function isEmail(str) {
	return /^([a-zA-Z0-9._-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(str)
}

/**
 * 手机号码验证
 * @param {*} str:字符串
 * 以数字1开头、第二位是3到9之间的任意数字，后面跟着任意9个数字（从0到9）
 */
export function isMobile(str) {
	return /^1[3-9]\d{9}$/.test(str)
}

/**
 * 电话号码验证
 * @param {*} str:字符串
 * 可选项：以 3 到 4 位数字开头，后面跟着一个连字符 "-" 必须有 7 到 8 位数字
 */
export function isPhone(str) {
	return /^([0-9]{3,4}-)?[0-9]{7,8}$/.test(str)
}

/**
 * 纯数字验证
 * @param {*} str:字符串
 * 这个正则表达式可以匹配由一个或多个数字字符组成的字符串。
 */
export function isNumber(str) {
	return /^[0-9]+$/.test(str)
}

/**
 * @name 正数和负数的校验规则
 * @param {*} str:字符串
 * 这个正则表达式可以匹配由一个或多个数字字符组成的字符串。
 */
export function isValidNumber(str) {
	return /^-?\d+(\.\d+)?$/.test(str);
}

/**
 * URL地址验证
 * @param {*} str:字符串
 * 以 "http://" 或 "https://" 开头，其中 "s" 是可选的
 * 后面跟着任意字符（包括字母、数字、特殊字符等）
 */
export function isURL(str) {
	return /^http[s]?:\/\/.*/.test(str)
}

/**
 * 身份证号码验证
 * @param {*} str:字符串
 * 前面有17个数字
 * 最后一位可以是数字（0-9）、大写字母 X 或小写字母 x
 */
export function isIdentityCard(str) {
	return /^\d{17}[\dXx]$/.test(str)
}

/**
 * 银行卡验证
 * @param {*} str:字符串
 * 这个正则表达式可以用来验证一个13到19位的银行卡号，只包含数字字符。
 */
export function isBankCard(str) {
	return /^[0-9]{13,19}$/.test(str)
}

/**
 * Luhn算法 银行卡验证 
 * @param {*} str:字符串
 * 银行卡号长度为12到19位
 * 银行卡号不能全为0
 */
export function isBankCardLuhn(str) {
	return /^(?!0+$)\d{12,19}$/.test(str)
}

/**
 * 姓名验证 
 * @param {*} str:字符串
 * 这个正则表达式可以匹配包含字母（包括Unicode字符）、空格、句点、撇号和连字符的字符串。
 */
export function isUsername(str) {
	return /^[\p{L}\s.'-]+$/.test(str)
}

/**
 * 昵称验证 
 * @param {*} str:字符串
 * 这个正则表达式可以匹配包含字母（包括Unicode字符）、空格、句点、撇号和连字符的字符串。
 */
export function isNickname(str) {
	return /^[a-zA-Z0-9_]{3,16}$/.test(str)
}

/**
 * 非法字符验证 
 * @param {*} str:字符串
 * 这个正则表达式可以匹配不包含空格、感叹号、at符号、井号、美元符号、百分号、插入符号、星号、括号、加号、等号、方括号、花括号、分号、单引号、双引号、反斜线、竖线、逗号、小于号、大于号和斜杠的字符串。
 */
export function isIllegalCharacter(str) {
	return /^[^\s!@#$%^&*()+=\[\]{};':"\\|,.<>/?]*$/.test(str)
}

/**
 * 密码验证 
 * @param {*} str:字符串
 * 包含至少一个大写字母（A-Z ） 						 (?=.*[A-Z]) 表示密码中必须包含至少一个大写字母
 * 包含至少一个小写字母（a-z）  						 (?=.*[a-z]) 表示密码中必须包含至少一个小写字母
 * 包含至少一个数字（0-9）      						 (?=.*\d) 表示密码中必须包含至少一个数字
 * 包含至少一个特殊字符（例如：@, $, !, %, *, ?, &,.）   (?=.*[@$!%*?&.]) 表示密码中必须包含至少一个特殊字符
 * 在这个正则表达式中，. 不需要使用转义字符 \ 进行转义，因为它出现在字符集 [ ] 中时不会产生特殊含义
 * 密码长度为8到16个字符
 */
export function isPassword(str) {
	return /^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@$!%*?&.])[A-Za-z\d@$!%*?&]{8,16}$/.test(str)
}

/** @param account 字符串  检测不能为纯数字 */
export function validateAccount(account) {
	let pattern = /^(?!\d+$).*/
	return pattern.test(account)
}

/** @param phoneNumber 字符串  // 替换号码中间四位为 * */
export function hidePhoneNumber(phoneNumber) {
	// 检查电话号码长度是否正确
	if (phoneNumber.length !== 11) {
		return phoneNumber; // 返回原始电话号码
	}
	// 使用正则表达式替换电话号码中间四位为 *
	const hiddenNumber = phoneNumber.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2');
	return hiddenNumber;
}

/** @param name 字符串  替换后面名字为 *  */
export function showFirstLetter(name) {
	// 检查姓名是否为空或长度为0
	if (!name || name.length === 0) {
		return ''; // 返回空字符串
	}
	// 获取姓名的第一个字
	const firstLetter = name.charAt(0);
	// 将后面的名字替换为 *
	const hiddenName = '*'.repeat(name.length - 1);
	// 将第一个字和隐藏的名字拼接起来
	const result = firstLetter + hiddenName;
	return result;
}